Generics
Birçok veri tipinde işlevsel olan bir kod yazabilseydik işlevsel olmaz mıydı? Şanlısıyız ki yapabiliriz ve bunu generics sayesinde gerçekleştirebiliriz.
Genericler somut tipler için soyut kavramlardır. Aslında bu yapılardan bir önceki başlık olan options
başlığında bahsetmiştik. Hadi genericler nasıl kullanabileceğimizi öğrenelim.
struct Point<T>{
}
Bu işlem için ilk olarak bir struct tanımlamamız gerekmektedir. Bu struct yapısının isminden sonra var olan kısıma generic
ismini vermekteyiz. Burada kullanılan T
ifadesi özel bir ifade olmaktadır ve herhangi bir tip anlamına gelmektedir. İçerisine herhangi b ir tip alabilir.
struct Point<T>{
x: T,
y: T
}
Yukarıda baktığımızda şu işlem olmaktadır. İlk olarak Point
içerisine herhangi bir tip alır. Sonrasında bu tipe bakar. Devamında bu tipi struct içerisinde kendisine eşitlenmiş tiplere atar. Yani üst tarafta ifade edildiği şekilde T
değeri hangi tip olursa olsun x
ve y
'de bu tip olmalıdır.
Bu tipte bir veri oluşturmak için birkaç yöntemimiz bulunmaktadır.
let coord = Point{x: 5.0, y: 6.0}; // İkisi de float sıkıntı yok.
let coord = Point{x: 'a', y: 'b'} // İkisi de char sıkıntı yok.
let coord = Point{x: 'a', y: 6.0} // Biri char biri float yani :ERROR:
Aynı zamanda birden fazla T
ifadesi oluşturabiliriz. Bu işlem için:
struct Point<T, U>{
x: T,
y: U
}
fn main(){
let coord = Point{x: 'a', y: 6.0} // Sıkıntı yok
}
Bu şekilde mimari ettiğimizde bu sefer iki farklı türe izin verildiği için bir sıkıntı olmayacaktır.